import axios from 'axios';
import { message } from 'ant-design-vue';
import { isUnDef, isNull } from './Is';
import { storage } from './storage';
import { Modal } from 'ant-design-vue';
import { loginOut } from '@/views/login/api';
import router from '../router';

axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL;
axios.defaults.withCredentials = true;
axios.defaults.timeout = 30000; // 请求超时时长

message.config({ duration: 2, maxCount: 3 });

// 取消请求用的
const pendingMap = new Map();
const addPending = (url, cancel) => {
  pendingMap.set(url, cancel);
};
const removePending = (url) => {
  pendingMap.delete(url);
};

axios.interceptors.request.use(
  (config) => {
    if (pendingMap.has(config.url) && !config.headers?.repeat) {
      const cancel = pendingMap.get(config.url);
      cancel && cancel();
      removePending(config.url);
    }

    config.cancelToken = new axios.CancelToken((c) => {
      addPending(config.url, c);
    });

    let token = '';
    try {
      token = storage.get('tsp-access_token');
    } catch (err) {
      console.error(err);
    }

    config.headers = Object.assign(
      {},
      {
        Authorization: 'Bearer ' + token,
      },
      config.headers
    );
    // 针对get请求params参数为空值时删除该参数
    if (config.method == 'get' && config.params) {
      Object.entries(config.params).forEach(([key, value]) => {
        if (isUnDef(value) || isNull(value) || value === '') {
          delete config.params[key];
        }
      });
    }

    // 统一url前缀
    config.url = `/tsp-api${config.url}`;

    return config;
  },
  (err) => {
    return Promise.reject(err);
  }
);

const errorCode = {
  '000': '操作太频繁，请勿重复请求',
  401: '当前操作没有权限',
  403: '当前操作没有权限',
  404: '资源不存在',
  417: '未绑定登录账号，请使用密码登录后绑定',
  423: '演示环境不能操作，如需了解联系冷冷',
  426: '用户名不存在或密码错误',
  428: '验证码错误,请重新输入',
  429: '请求过频繁',
  479: '演示环境，没有权限操作',
  default: '系统未知错误,请反馈给管理员',
};

// 返回结果拦截
axios.interceptors.response.use(
  async (response) => {
    // 请求完成后删除掉cancel Map里的url值
    removePending(response.config.url);
    const {
      status,
      data,
      data: { code },
    } = response;

    if (isUnDef(code)) {
      return Promise.resolve(data);
    }

    if (code != 0 && code != 200) {
      message.warning(msg);
      return msg ? Promise.reject(msg) : Promise.reject(data?.data);
    }
    return Promise.resolve(data.data);
  },
  async (err) => {
    const {
      response: {
        status,
        data: { msg },
      },
    } = err;

    // 后台定义 424 针对令牌过去的特殊响应码
    if (status === 424) {
      Modal.warning({
        title: '系统提示',
        content: '令牌状态已过期，请点击重新登录',
        okText: '确定',
        onOk() {
          loginOut().then(() => {
            storage.clear();
            router.push('/login');
          });
        },
      });
    }
    const errMsg = msg || errorCode[status] || errorCode['default'];
    if (axios.isCancel(err)) {
      return err;
    }
    // 接口请求超时
    else if (errMsg.toString().indexOf('timeout') !== -1) {
      message.error('网络请求超时');
    }
    // 接口路径错误
    else if (errMsg.toString().indexOf('404') !== -1) {
      message.error('网络请求错误，404 Request！');
    } else {
      message.error(errMsg.toString());
    }

    return Promise.reject(err);
  }
);

export default axios;
